<?php
//反射api
//反射是指php在运行的状态中,扩展分析php程序，导出或者提起关于类，方法属性参数等详细信息，包括注释
class person{
    public $name = 'Tim';
    public $gender;
    public function say(){
        echo $this->name , "\t is" , $this->gender, "\r\n";
    }
    public function __set($name,$value){
        echo "Setting $name to $value \r\n";
        $this->$name = $value;
    }
    public function __get($name){
        if(!isset($this->$name)){
            echo '未设置';
            $this->$name = "正在为你设置默认值";
        }
        return $this->$name;
    }
}

$student = new person();
$student->name = 'Tom';
$student->gender = 'male';
$student->age;
echo "\r\n";
/*
//使用反射api来获取属性或者方法
//获取对象属性列表
//反射对象
$reflect = new ReflectionObject($student);
$props = $reflect->getProperties();
foreach($props as $prop){
    //获取属性的名称
    print $prop->getName()."\n";
}

echo "\r\n";
//获取对象方法列表
$m = $reflect->getMethods();
foreach($m as $prop){
    print $prop->getName() . "\n";
}
*/


//返回对象属性的关联数组
// $props = get_object_vars($student);
// foreach($props as $key => $prop){
//     echo $key , "\r\n";
// }

//类属性
//只获取类内部本身的属性  不包括外部添加的
// var_dump(get_class_vars(get_class($student)));
//返回由类的方法名组合成的数组
// var_dump();

//返回由类的方法名组成的数组
// $methods = get_class_methods(get_class($student));
// foreach($methods as $method){
//     echo $method  , "\r\n";
// }


//加入这个对象是从其他页面传递过来的,怎么知道他是属于那个类啊
//获取对象所属的类
// echo get_class($student);


//反射api的功能显然是很强大的，甚至能还原这个类的原型，包括访问权限
//反射获取类的原型
$obj = new ReflectionClass('person');
//获取类的名称
$className = $obj->getName();
//定义存储方法和属性的数组
$Methods = $Properies = [];

//获取当前对象的属性
foreach($obj->getProperties() as $v){
    $Properies[$v->getName()] = $v;
}

//获取当前对象的方法
foreach($obj->getMethods() as $v){
    $Methods[$v->getName()] = $v;
}

echo "class {$className} \n{\n";
    is_array($Properies) && ksort($Properies);
    foreach($Properies as $k => $v){
        echo "\t";
        echo $v->isPublic() ? 'public' : '',
             $v->isPrivate() ? 'private' : '',
             $v->isProtected() ? 'protected' : '',
             $v->isStatic() ? 'static' : '';
             echo " \${$k}\n";
    }
    echo "\n";
    //进行方法的循环
    if(is_array($Methods)) ksort($Methods);
    foreach($Methods as $k => $v){
        echo "\t function {$k} () {} \n";
    }

echo "}\n";






